# 方法
'''
对象方法：
    通过实例调用，可以引用类内部的任何属性和方法（无法用类名调用）
    格式：对象名.方法名（参数列表）
    注意：对象方法的第一个参数必须是self，其余参数按顺序排列
    self：代表一个对象，哪个对象调用的对象方法，那么在方法中self就代表哪个对象


类方法：
    可用类名调用，也可用对象调用（通常不使用）
    无需实例化，用类名调用，可以调用类的属性和方法，无法取到普通的对象属性和方法
    使用@classmethod定义类方法
    cls:表示 类名


静态方法：
    无论用类调用还是用对象调用，都无法获取到类内部的属性和方法，完全独立的一个
    方法，使用@staticmethod定义
    静态方法里面不可以调用对象方法和类方法

总结：
    类方法效率比对象方法高，因为类方法无需实例化对象，并且节省内存，当方法种不涉及
    对象方法属性和方法时使用
    静态方法一般用作工具方法。
'''
class Person(object):
    # 对象方法
    def eat(self, x, y):
        # 对象方法里可以调用对象方法
        print(self.eat1("梨", "橘子"))
        return "吃%s和%s"%(x, y)
    def eat1(self, x, y):
        return "吃%s和%s"%(x, y)
    # 类方法
    @classmethod
    def run(cls, m):
        # 类方法里可以使用类方法
        print(cls.run1(80))
        return "跑%s米"%m

    @classmethod
    def run1(cls, m):
        return "1跑%s米" % m
    # 静态方法
    @staticmethod
    def play(x):
        return "玩%s" % x

per = Person()
# 调用对象方法
print(per.eat("苹果", "香蕉"))


# 调用类方法
# 用对象调用类方法（通常不使用）
print(per.run(100))
# 使用类名调用类方法
print(Person.run(200))

# 调用静态方法
print(per.play("球"))
print(Person.play("球"))
